#ifndef ONLINE_TABLE_H_
#define ONLINE_TABLE_H_

#include <string>
#include <map>

/// @brief 用户数据项
struct OnlineItem
{
    unsigned int id;
    std::string username;
    std::string alias;
    bool isOnline;
    OnlineItem *pre;
    OnlineItem *next;
};

/// @brief 用户表
class OnlineTable
{
public:
    virtual ~OnlineTable();
    /// @brief 插入新项
    /// @param username 用户名
    /// @param alias 别名
    /// @param isOnline 是否在线标识
    /// @return size
    int Insert(std::string username, std::string alias, bool isOnline = false);
    /// @brief 用户上线
    bool Online(unsigned int id);
    /// @brief 用户离线
    void Offline(unsigned int id);
    /// @brief 表大小
    int size() const;
    /// @brief 根据用户名寻找对应项
    OnlineItem *FindByUsername(std::string username);
    /// @brief 根据别名寻找对应项
    OnlineItem *FindByAlias(std::string alias);
    /// @brief 获取用户表的当前在线用户的拷贝数据
    std::map<unsigned int, std::string> GetOnlineTableRef();

private:
    OnlineItem *root_ = nullptr;
    int size_ = 0;
};

#endif